Amazon Bedrock がクロスリージョン推論(モデル実行)をサポートしました
こんにちは!AWS 事業本部コンサルティング部のたかくに(@takakuni_)です。
Amazon Bedrock がクロスリージョン推論(モデル実行)をサポートしました。一言で革命ですね。
クォータのおさらい
個人利用の程度であれば、クォータに引っかかりづらいですが、 AWS を使う大半の理由はビジネスです。
モデルの実行クォータは、モデルの種類/リージョンごとに異なります。以下は執筆時点のモデルクォータの一例です。
Anthropic Claude 3.5 Sonnet のモデル実行
リージョン | 1 分間に処理されるリクエスト数 | 1 分間に処理されるトークン数 | サービスクォータで調整可能かどうか |
---|---|---|---|
us-west-2 | 250 | 2,000,000 | いいえ |
ap-northeast-1 | 20 | 200,000 | いいえ |
ap-southeast-1 | 20 | 200,000 | いいえ |
eu-central-1 | 20 | 200,000 | いいえ |
それ以外 | 50 | 400,000 | いいえ |
Anthropic Claude 3 Haiku のモデル実行
リージョン | 1 分間に処理されるリクエスト数 | 1 分間に処理されるトークン数 | サービスクォータで調整可能かどうか |
---|---|---|---|
us-east-1, us-west-2 | 1,000 | 2,000,000 | いいえ |
ap-northeast-1, ap-southeast-1 | 200 | 200,000 | いいえ |
それ以外 | 400 | 300,000 | いいえ |
Anthropic Claude 3 Opus のモデル実行
リージョン | 1 分間に処理されるリクエスト数 | 1 分間に処理されるトークン数 | サービスクォータで調整可能かどうか |
---|---|---|---|
すべてのリージョン | 50 | 400,000 | いいえ |
今までの運用
アップデート前までをおさらいします。Anthropic Claude 3.5 Sonnet の AI アプリケーションを作りたいと仮定します。
クロスリージョン推論がサポートされていないため、モデルの実行に対するスロットリングは、次のようにカバーするケースが考えられます。
- オレゴン(us-west-2)リージョンなど、容量が大きいリージョンを利用する
- アプリケーション側で
- スロットリング発生時にリトライ処理を組み込む
- スロットリング発生時に別リージョンのリージョナルエンドポイントにリクエストを送信する
- API キーを発行しクライアントに制限をかける
- プロビジョンドスループットを購入する
参考:Bedrock の Too Many Request 解決してみた - Speaker Deck
アップデート内容
今回のアップデートで、モデルのクロスリージョン推論をサポートしました。この機能によって、 2-2 の処理を AWS 側にオフロードできるようになりました。
クロスリージョン推論機能は InvokeModel
, InvokeModelWithResponseStream
, Converse
, ConverseStream
の 4 つの API で利用できます。
Model inference – You can use cross-region inference when running model invocation using the Playgrounds in the Amazon Bedrock console, or when using the InvokeModel, InvokeModelWithResponseStream, Converse, and ConverseStream operations. [1]
アーキテクチャ
AWS Blog にルーティングのアーキテクチャが乗ってますね。見慣れない色ですが、 App Mesh の Virtual Router でルーティング、 Network Load Balancer で負荷分散をしているようですね。
クロスリージョン推論のルーティングは、次のステップで行われます。
- リクエストの送信元と同じリージョンでキャパシティをチェックする
- 十分なキャパシティがある場合は、リクエスト送信元と同じリージョンで推論が行われる
- キャパシティが不足している場合は、リクエストを受け入れるキャパシティがあるセカンダリリージョンを決定する
- 決定されたリージョンにリクエストを再ルーティングする
ちなみに、セカンダリリージョンの決定、ルーティングは、キャパシティが多い順で行われるそうです。
The operational flow starts with an Inference request coming to a primary region for an on-demand baseline model. Capacity evaluations are made on the primary region and the secondary region list, creating a region capacity list in capacity order. The region with the most available capacity, in this case eu-central-1 (Frankfurt), is selected as the next target. [2:1]
現時点では、オンデマンドキャパシティのみでプロビジョンドキャパシティは未サポートでした。
You can also increase throughput for a model by purchasing Provisioned Throughput. Inference profiles currently don't support Provisioned Throughput.[1:1]
ネットワーク
リージョン間のネットワークは、AWS のバックボーンネットワークが使用されるようです。インターネットで疎通を行えない要件にも対応してますね。
AWS network backbone is used for data transfer between regions instead of internet or VPC peering, resulting in secure and reliable execution.[2:2]
また、アプリケーションから VPC エンドポイントを経由でも利用可能です。
Can we use PrivateLink? Yes, you will be able to leverage your private links and ensure traffic flows via your VPC with this feature.[2:3]
諸々注意事項
AWS Blog [2:5] で拾えてない部分を箇条書きでまとめます。
- エンド ユーザー ライセンス契約を含む、特定のモデルの使用に適用されるすべての条件は、クロスリージョン推論を使用する場合にも適用される
- ログはリクエストの発信元であるプライマリリージョンに記録される
- どのリージョンで推論したかはログに記録される
- 推論プロファイルがあるリージョンで割り当てられたクォータの最大 2 倍のスループットを実現できる
- クロスリージョン推論機能の利用で別途追加の料金は発生しない
推論プロファイルのリージョン組み合わせ
今回の推論プロファイルは、いくつかのリージョンによって構成されます。東京リージョンも将来的にサポートしてほしいですね。
推論プロファイル名 | 推論プロファイル ID | リージョンの組み合わせ |
---|---|---|
US Anthropic Claude 3 Haiku | us.anthropic.claude-3-haiku-20240307-v1:0 | US East (N. Virginia) (us-east-1) US West (Oregon) (us-west-2) |
EU Anthropic Claude 3 Haiku | eu.anthropic.claude-3-haiku-20240307-v1:0 | Europe (Frankfurt) (eu-central-1) Europe (Ireland) (eu-west-1) Europe (Paris) (eu-west-3) |
US Anthropic Claude 3 Opus | us.anthropic.claude-3-opus-20240229-v1:0 | US East (N. Virginia) (us-east-1) US West (Oregon) (us-west-2) |
US Anthropic Claude 3 Sonnet | us.anthropic.claude-3-sonnet-20240229-v1:0 | US East (N. Virginia) (us-east-1) US West (Oregon) (us-west-2) |
EU Anthropic Claude 3 Sonnet | eu.anthropic.claude-3-sonnet-20240229-v1:0 | Europe (Frankfurt) (eu-central-1) Europe (Ireland) (eu-west-1) Europe (Paris) (eu-west-3) |
US Anthropic Claude 3.5 Sonnet | us.anthropic.claude-3-5-sonnet-20240620-v1:0 | US East (N. Virginia) (us-east-1) US West (Oregon) (us-west-2) |
EU Anthropic Claude 3.5 Sonnet | eu.anthropic.claude-3-5-sonnet-20240620-v1:0 | Europe (Frankfurt) (eu-central-1) Europe (Ireland) (eu-west-1) Europe (Paris) (eu-west-3) |
やってみる
推論プロファイルを利用したクロスリージョン推論を試してみます。
boto3 は v1.35.7 から利用可能なようです。
1.35.7
======
+ * api-change:``bedrock``: [``botocore``] Amazon Bedrock SDK updates for Inference Profile.
+ * api-change:``bedrock-runtime``: [``botocore``] Amazon Bedrock SDK updates for Inference Profile.
* api-change:``chatbot``: [``botocore``] Update documentation to be consistent with the API docs
* api-change:``omics``: [``botocore``] Adds data provenance to import jobs from read sets and references
* api-change:``polly``: [``botocore``] Amazon Polly adds 2 new voices: Jitka (cs-CZ) and Sabrina (de-CH).
推論プロファイルを見てみる
バージニアリージョンのマネジメントコンソールを眺めてみます。新しく Cross-region inference
が増えてますね。
クリックすると現時点では 4 つの利用可能な推論プロファイルが表示されています。
モデルの実行
実際にモデルを実行してみます。
モデル ID の部分を書き換えるだけで利用できます。既存コードへの修正が少なく便利ですね。
import boto3
region_name = "us-east-1"
bedrock_runtime = boto3.client("bedrock-runtime", region_name=region_name)
system_prompt = "あなたは AWS サービスの専門家であり、常に正確で簡潔な回答を提供します。"
input_message = "S3、EBS、EFS の違いを教えてください。日本語で回答してください。"
+ modelId = "us.anthropic.claude-3-5-sonnet-20240620-v1:0"
- modelId = "anthropic.claude-3-5-sonnet-20240620-v1:0"
response = bedrock_runtime.converse(
modelId=modelId,
system=[{"text": system_prompt}],
messages=[{
"role": "user",
"content": [{"text": input_message}]
}]
)
print(response["output"]["message"]["content"][0]["text"])
(app-py3.12) takakuni@ app % python converse.py
S3、EBS、EFSはAWSの主要なストレージサービスですが、それぞれ異なる用途と特徴があります。
1. Amazon S3 (Simple Storage Service):
- オブジェクトストレージ
- 高い耐久性と可用性
- ウェブからアクセス可能
- 大容量データの長期保存に適する
- データバックアップ、静的ウェブサイトホスティングなどに利用
2. Amazon EBS (Elastic Block Store):
- ブロックレベルのストレージ
- EC2インスタンスにアタッチして使用
- 高性能で低レイテンシー
- データベースやファイルシステムなど、頻繁に更新されるデータに適する
- スナップショット機能でバックアップが容易
3. Amazon EFS (Elastic File System):
- フルマネージドのNFSファイルシステム
- 複数のEC2インスタンスから同時にアクセス可能
- 自動的にスケーリング
- 共有ファイルストレージが必要なアプリケーションに適する
- コンテンツ管理、ウェブサービング、データ分析などに利用
これらのサービスは、それぞれの特性に応じて適切なユースケースで使用することが重要です。
Converse Stream API も問題なく動きますね。
import boto3
region_name = "us-east-1"
bedrock_runtime = boto3.client("bedrock-runtime", region_name=region_name)
system_prompt = "あなたは AWS サービスの専門家であり、常に正確で簡潔な回答を提供します。"
input_message = "S3、EBS、EFS の違いを教えてください。日本語で回答してください。"
- modelId = "anthropic.claude-3-5-sonnet-20240620-v1:0"
+ modelId = "us.anthropic.claude-3-5-sonnet-20240620-v1:0"
streaming_response = bedrock_runtime.converse_stream(
modelId=modelId,
system=[{"text": system_prompt}],
messages=[{
"role": "user",
"content": [{"text": input_message}]
}]
)
for chunk in streaming_response["stream"]:
if "contentBlockDelta" in chunk:
text = chunk["contentBlockDelta"]["delta"]["text"]
print(text, end="")
レイテンシーの違いを見てみる
AWS 調べではトラフィックの再ルーティングが発生すると、2 桁のミリ秒ほどの遅延が発生していたとのことです。
There will be additional latency incurred when re-routing happens and, in our testing, it has been a double-digit milliseconds latency add. [2:6]
個人的にクロスリージョン推論は、そもそも推論前にリクエスト送信元リージョンのキャパシティチェックが入るため、プライマリリージョンで推論されても、レイテンシーに違いがあるのでは?と思いました。
簡単ではありますが、実際にモデル ID を変更して試してみました。
各モデル ID ごとに推論にかかった時間(latencyMs
)を測定してみます。オレゴンリージョンに比べ、 Claude 3.5 Sonnet のキャパシティが低い、バージニアリージョンから推論を行います。
import boto3
region_name = "us-east-1"
bedrock_runtime = boto3.client("bedrock-runtime", region_name=region_name)
system_prompt = "あなたは AWS サービスの専門家であり、常に正確で簡潔な回答を提供します。"
input_message = "S3、EBS、EFS の違いを教えてください。日本語で回答してください。"
modelId = ("Foundation Model", "anthropic.claude-3-5-sonnet-20240620-v1:0")
inferenceProfileId = ("Inference Profile", "us.anthropic.claude-3-sonnet-20240229-v1:0")
for inference_type, id in [modelId, inferenceProfileId]:
response = bedrock_runtime.converse(
modelId=id,
system=[{"text": system_prompt}],
messages=[{
"role": "user",
"content": [{"text": input_message}]
}]
)
latency_seconds = response['metrics']['latencyMs'] / 1000
print(f"::{inference_type}::Response time: {latency_seconds:.2f} second(s)")
print(f"::{inference_type}::Response output: {response['output']['message']['content'][0]['text']}")
10 回ほど計測した結果です。Claude 3.5 Sonnet の場合、10 回中に 7 回オレゴンリージョンで推論が行われたことから、平均で 3.20 秒ほど差がありました。結果的にプライマリリージョンで処理された推論にも違いがありますね。
回数 | クロスリージョン推論時間(推論が行われたリージョン) | 単一リージョン推論時間 | 時間差 |
---|---|---|---|
01 | 11.76 秒(us-west-2) | 7.57 秒 | 4.19 秒 |
02 | 8.76 秒(us-east-1) | 5.77 秒 | 2.99 秒 |
03 | 9.16 秒(us-west-2) | 6.29 秒 | 2.87 秒 |
04 | 8.43 秒(us-west-2) | 7.11 秒 | 1.32 秒 |
05 | 12.44 秒(us-west-2) | 6.73 秒 | 5.71 秒 |
06 | 7.91 秒(us-east-1) | 6.84 秒 | 1.07 秒 |
07 | 8.80 秒(us-west-2) | 6.29 秒 | 2.51 秒 |
08 | 10.38 秒(us-east-1) | 6.83 秒 | 3.55 秒 |
09 | 9.57 秒(us-west-2) | 6.61 秒 | 2.96 秒 |
10 | 11.88 秒(us-west-2) | 6.96 秒 | 4.92 秒 |
推論が行われたリージョンを把握する方法
推論プロファイルを利用してクロスリージョン推論を行った場合、モデルの実行ログに inferenceRegion
キーが追加されます。(Converse API のレスポンスからは見えません)
{
"schemaType": "ModelInvocationLog",
"schemaVersion": "1.0",
"timestamp": "2024-08-31T07:36:29Z",
"accountId": "123456789012",
"identity": {
"arn": "arn:aws:sts::123456789012:assumed-role/takakuni/botocore-session-1725087142"
},
"region": "us-east-1",
"requestId": "bcde8c84-5d18-4016-ad13-36f5b3811e83",
"operation": "Converse",
"modelId": "us.anthropic.claude-3-sonnet-20240229-v1:0",
"input": {
"inputContentType": "application/json",
"inputBodyJson": {
"messages": [
{
"role": "user",
"content": [
{
"text": "S3、EBS、EFS の違いを教えてください。日本語で回答してください。"
}
]
}
],
"system": [
{
"text": "あなたは AWS サービスの専門家であり、常に正確で簡潔な回答を提供します。"
}
]
},
"inputTokenCount": 65
},
"output": {
"outputContentType": "application/json",
"outputBodyJson": {
"output": {
"message": {
"role": "assistant",
"content": [
{
"text": "S3、EBS、EFSはAmazon Web Servicesが提供するストレージサービスですが、その用途と性質は異なります。\n\n**S3 (Simple Storage Service)**\n- オブジェクトストレージサービス\n- ファイルやデータを保存するための高度に耐障害性と耐久性のあるオブジェクトストレージ\n- インターネットからどこからでもアクセス可能\n- スケーラブルで低コストなデータストレージ\n- 主にスタティックコンテンツ、バックアップデータ、ビッグデータ分析などに使用\n\n**EBS (Elastic Block Store)**\n- ブロックレベルのストレージボリューム\n- EC2インスタンスに永続的なデータストレージを提供\n- デフォルトでは高度にレプリケーションされ、耐久性が高い\n- EC2インスタンスがシャットダウンしても、データは消えない\n- データベース、アプリケーションなど、頻繁な読み書きが必要なワークロードに最適化\n\n**EFS (Elastic File System)**\n- 完全にマネージド型のファイルストレージサービス\n- NFSバージョン4に準拠した共有ファイルシステム\n- 複数のEC2インスタンス間でデータを共有できる\n- ファイルデータはAWSデータセンター内にレプリケーションされ、堅牢性が高い\n- ビッグデータ分析、メディア処理、コンテンツ管理などに活用\n\n要約すると、S3はオブジェクトストレージ、EBSはEC2インスタンスにアタッチするブロックレベルストレージ、EFSは複数EC2インスタンス間で共有できるファイルシステムです。用途に合わせて適切なストレージサービスを選択する必要があります。"
}
]
}
},
"stopReason": "end_turn",
"metrics": {
"latencyMs": 11759
},
"usage": {
"inputTokens": 65,
"outputTokens": 560,
"totalTokens": 625
}
},
"outputTokenCount": 560
},
+ "inferenceRegion": "us-west-2"
}
プライマリリージョンで利用できないモデルを実行する
AWS ブログに次の記載がありました
You can access a select list of models via cross-region inference, which are essentially region agnostic models made available across the entire region-set. You will be able to use a subset of models available in Amazon Bedrock from anywhere inside the region-set even if the model is not available in your primary region.[2:7]
ぜひ、試してみましょう。
執筆時点で Anthropic Claude 3.5 Sonnet はフランクフルトリージョンではサポートしています。しかし、同じ推論プロファイルに属する、アイルランド、パリリージョンではサポートしていません。
ということで、パリリージョンから推論プロファイルを利用して、パリリージョンでは利用できない Anthropic Claude 3.5 Sonnet モデルを呼び出してみます。図にすると、以下のイメージです。
パリリージョンのモデル有効化
まずは、パリリージョンの Bedrock コンソールでモデルの有効化を行います。 Claude 3.5 Sonnet の部分に Cross-region inference が表示されていますね。
パリリージョンエンドポイント経由で推論
モデルの有効化後、以下のコードで Claude 3.5 Sonnet をパリリージョンの Bedrock エンドポイントから呼び出します。
import boto3
region_name = "eu-west-3"
bedrock_runtime = boto3.client("bedrock-runtime", region_name=region_name)
system_prompt = "あなたは AWS サービスの専門家であり、常に正確で簡潔な回答を提供します。"
input_message = "S3、EBS、EFS の違いを教えてください。日本語で回答してください。"
# modelId = "anthropic.claude-3-5-sonnet-20240620-v1:0"
modelId = "eu.anthropic.claude-3-5-sonnet-20240620-v1:0"
response = bedrock_runtime.converse(
modelId=modelId,
system=[{"text": system_prompt}],
messages=[{
"role": "user",
"content": [{"text": input_message}]
}]
)
print(response["output"]["message"]["content"][0]["text"])
回答が返ってきましたね。素晴らしい。
(app-py3.12) takakuni@ app % python invoke_mode_from_paris.py
S3、EBS、EFSはAWSのストレージサービスですが、それぞれ異なる用途と特徴があります。
1. S3 (Simple Storage Service):
- オブジェクトストレージ
- 高い耐久性と可用性
- インターネットからアクセス可能
- 大容量データの保存に適している
- 静的ウェブサイトのホスティングが可能
2. EBS (Elastic Block Store):
- ブロックストレージ
- EC2インスタンスに直接アタッチ
- 高速な読み書きが可能
- データベースやファイルシステムに適している
- スナップショット機能あり
3. EFS (Elastic File System):
- ファイルストレージ
- 複数のEC2インスタンスから同時にアクセス可能
- 自動でスケーリング
- Linux用のNFSファイルシステム
- 共有ファイルシステムに適している
ログからもフランクフルトリージョン(eu-central-1)で推論が行われたと記録されていました。
{
"schemaType": "ModelInvocationLog",
"schemaVersion": "1.0",
"timestamp": "2024-09-01T05:46:20Z",
"accountId": "123456789012",
"identity": {
"arn": "arn:aws:sts::123456789012:assumed-role/takakuni/botocore-session-1725169573"
},
"region": "eu-west-3",
"requestId": "07785801-6f1a-4553-bd06-edccea61e20c",
"operation": "Converse",
"modelId": "eu.anthropic.claude-3-5-sonnet-20240620-v1:0",
"input": {
"inputContentType": "application/json",
"inputBodyJson": {
"messages": [
{
"role": "user",
"content": [
{
"text": "S3、EBS、EFS の違いを教えてください。日本語で回答してください。"
}
]
}
],
"system": [
{
"text": "あなたは AWS サービスの専門家であり、常に正確で簡潔な回答を提供します。"
}
]
},
"inputTokenCount": 65
},
"output": {
"outputContentType": "application/json",
"outputBodyJson": {
"output": {
"message": {
"role": "assistant",
"content": [
{
"text": "S3、EBS、EFSはそれぞれAWSのストレージサービスですが、用途や特徴が異なります。以下に主な違いを説明します:\n\n1. Amazon S3 (Simple Storage Service)\n- オブジェクトストレージ\n- 無制限の拡張性\n- HTTPSを介してアクセス\n- データの長期保存に適している\n- 静的ウェブサイトホスティングが可能\n\n2. Amazon EBS (Elastic Block Store)\n- ブロックストレージ\n- EC2インスタンスにアタッチして使用\n- 1つのEBSボリュームは1つのEC2インスタンスにのみアタッチ可能\n- 高速なI/O性能が必要なアプリケーションに適している\n\n3. Amazon EFS (Elastic File System)\n- ファイルストレージ\n- 複数のEC2インスタンスから同時にアクセス可能\n- 自動的に拡張・縮小する\n- 共有ファイルシステムが必要なアプリケーションに適している\n\nこれらのサービスは、それぞれの特性に応じて適切なユースケースで使用されます。"
}
]
}
},
"stopReason": "end_turn",
"metrics": {
"latencyMs": 5995
},
"usage": {
"inputTokens": 65,
"outputTokens": 344,
"totalTokens": 409
}
},
"outputTokenCount": 344
},
"inferenceRegion": "eu-central-1"
}
念の為、推論プロファイルではなくモデル ID を直接指定して実行してみます。
import boto3
region_name = "eu-west-3"
bedrock_runtime = boto3.client("bedrock-runtime", region_name=region_name)
system_prompt = "あなたは AWS サービスの専門家であり、常に正確で簡潔な回答を提供します。"
input_message = "S3、EBS、EFS の違いを教えてください。日本語で回答してください。"
+ modelId = "anthropic.claude-3-5-sonnet-20240620-v1:0"
- modelId = "eu.anthropic.claude-3-5-sonnet-20240620-v1:0"
response = bedrock_runtime.converse(
modelId=modelId,
system=[{"text": system_prompt}],
messages=[{
"role": "user",
"content": [{"text": input_message}]
}]
)
print(response["output"]["message"]["content"][0]["text"])
想定通りモデルがサポートされていないと表示されました。
(app-py3.12) takakuni@ app % python invoke_mode_from_paris.py
Traceback (most recent call last):
File "/Users/takakuni/Documents/genai-blog/bedrock_cross_region_inference/app/invoke_mode_from_paris.py", line 11, in <module>
response = bedrock_runtime.converse(
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/Documents/genai-blog/bedrock_cross_region_inference/app/.venv/lib/python3.12/site-packages/botocore/client.py", line 569, in _api_call
return self._make_api_call(operation_name, kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/Documents/genai-blog/bedrock_cross_region_inference/app/.venv/lib/python3.12/site-packages/botocore/client.py", line 1023, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.errorfactory.ValidationException: An error occurred (ValidationException) when calling the Converse operation: The provided model doesn't support on-demand throughput.
フランクフルトリージョンのモデル有効化は必要?
不要でした。「リクエスト元リージョンで有効化しているため、OK とする」なのかは、私はどこからも読み取れませんでしたが共有です。(詳しい方いれば教えてください)
まとめ
以上、「Amazon Bedrock がクロスリージョン推論(モデル実行)をサポートしました。」でした。
プライマリリージョンでサポートしていないモデルを同じ ID やリージョナルエンドポイントから実行できる点、クォータの制御処理などを AWS 側にオフロードできる点素晴らしいですね。
今回は決めうち(System-defined な)推論プロファイルがサポートされましたが、ユーザーが定義可能なプロファイルも今後期待ですね。
このブログがどなたかの参考になれば幸いです。
AWS 事業本部コンサルティング部のたかくに(@takakuni_)でした!